/**
 * 百度贴吧爬虫配置文件
 * @description 定义爬取规则、请求参数、选择器等配置
 */

/**
 * 爬虫基础配置
 * @typedef {Object} CrawlerConfig
 * @property {string} baseUrl - 贴吧基础URL
 * @property {Object} headers - 请求头配置
 * @property {number} requestDelay - 请求间隔时间(毫秒)
 * @property {number} maxRetries - 最大重试次数
 */
const crawlerConfig = {
  // 贴吧基础URL
  baseUrl: 'https://tieba.baidu.com',
  
  // 请求头配置 - 模拟真实浏览器
  headers: {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'Accept-Encoding': 'gzip, deflate, br',
    'Cache-Control': 'no-cache',
    'Pragma': 'no-cache',
    'Sec-Ch-Ua': '"Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"',
    'Sec-Ch-Ua-Mobile': '?0',
    'Sec-Ch-Ua-Platform': '"Windows"',
    'Sec-Fetch-Dest': 'document',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-Site': 'none',
    'Sec-Fetch-User': '?1',
    'Upgrade-Insecure-Requests': '1',
    'DNT': '1',
    'Connection': 'keep-alive',
    'Referer': 'https://tieba.baidu.com/',
    'Origin': 'https://tieba.baidu.com'
  },
  
  // 请求延迟配置（毫秒）- 增加延迟避免被检测
  requestDelay: 2000,
  
  // 最大重试次数
  maxRetries: 3,
  
  // 超时时间（毫秒）
  timeout: 15000
};

/**
 * 贴吧页面选择器规则
 * @typedef {Object} SelectorRules
 * @property {Object} postList - 帖子列表选择器
 * @property {Object} postDetail - 帖子详情选择器
 * @property {Object} userInfo - 用户信息选择器
 */
const selectorRules = {
  // 帖子列表页面选择器
  postList: {
    // 帖子列表容器
    containerSelector: '.threadlist_lz .j_thread_list',
    
    // 单个帖子选择器
    postItemSelector: '.j_thread_list tbody',
    
    // 帖子标题
    titleSelector: '.threadlist_title a',
    
    // 发帖人
    authorSelector: '.threadlist_author .frs-author-name a',
    
    // 回复数
    replyCountSelector: '.threadlist_rep_num',
    
    // 发帖时间
    postTimeSelector: '.threadlist_time',
    
    // 帖子链接
    linkSelector: '.threadlist_title a'
  },
  
  // 帖子详情页面选择器
  postDetail: {
    // 帖子标题
    titleSelector: '.core_title_txt',
    
    // 楼层列表
    floorListSelector: '.l_post',
    
    // 楼层内容
    floorContentSelector: '.d_post_content',
    
    // 楼层作者
    floorAuthorSelector: '.d_name a',
    
    // 楼层时间
    floorTimeSelector: '.post-tail-wrap .tail-info',
    
    // 楼层号
    floorNumberSelector: '.lou_num',
    
    // 点赞数
    likeCountSelector: '.d_post_content_main .agree_num'
  },
  
  // 用户信息选择器
  userInfo: {
    // 用户名
    usernameSelector: '.d_name a',
    
    // 用户等级
    userLevelSelector: '.d_badge_lv',
    
    // 用户头像
    avatarSelector: '.d_avatar img'
  },
  
  // 分页选择器
  pagination: {
    // 下一页链接
    nextPageSelector: '.next',
    
    // 页码列表
    pageNumberSelector: '.pagination a'
  }
};

/**
 * 数据提取规则
 * @typedef {Object} ExtractionRules
 * @property {Function} cleanText - 文本清理函数
 * @property {Function} parseTime - 时间解析函数
 * @property {Function} parseNumber - 数字解析函数
 */
const extractionRules = {
  /**
   * 清理文本内容
   * @param {string} text - 原始文本
   * @returns {string} - 清理后的文本
   */
  cleanText: (text) => {
    if (!text) return '';
    return text.trim().replace(/\s+/g, ' ').replace(/[\r\n\t]/g, '');
  },
  
  /**
   * 解析时间字符串
   * @param {string} timeStr - 时间字符串
   * @returns {string} - 标准化时间格式
   */
  parseTime: (timeStr) => {
    if (!timeStr) return '';
    
    // 处理相对时间格式（如：1小时前、昨天、今天）
    const now = new Date();
    const timeText = timeStr.trim();
    
    if (timeText.includes('分钟前')) {
      const minutes = parseInt(timeText);
      return new Date(now.getTime() - minutes * 60 * 1000).toISOString();
    }
    
    if (timeText.includes('小时前')) {
      const hours = parseInt(timeText);
      return new Date(now.getTime() - hours * 60 * 60 * 1000).toISOString();
    }
    
    if (timeText.includes('昨天')) {
      const yesterday = new Date(now);
      yesterday.setDate(yesterday.getDate() - 1);
      return yesterday.toISOString();
    }
    
    return timeText;
  },
  
  /**
   * 解析数字字符串
   * @param {string} numStr - 数字字符串
   * @returns {number} - 解析后的数字
   */
  parseNumber: (numStr) => {
    if (!numStr) return 0;
    const cleaned = numStr.replace(/[^0-9]/g, '');
    return parseInt(cleaned) || 0;
  }
};

/**
 * 输出配置
 * @typedef {Object} OutputConfig
 * @property {string} dataDir - 数据保存目录
 * @property {string} format - 输出格式
 * @property {boolean} saveImages - 是否保存图片
 */
const outputConfig = {
  // 数据保存目录
  dataDir: './data',
  
  // 输出格式 (json, csv, txt)
  format: 'json',
  
  // 是否保存图片
  saveImages: false,
  
  // 文件命名规则
  fileNamePattern: '{tieba_name}_{date}',
  
  // 单文件最大记录数
  maxRecordsPerFile: 1000
};

module.exports = {
  crawlerConfig,
  selectorRules,
  extractionRules,
  outputConfig
}; 